#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
using namespace std;

// int main()
// {
// 	cout << "11111" << endl;
// 	cerr << "11111" << endl;
// 	clog << "11111" << endl;

// 	string str;
// 	cout << cin.good() << endl;
// 	cout << cin.eof() << endl;
// 	cout << cin.bad() << endl;
// 	cout << cin.fail() << endl << endl;

// 	// istream& operator>> (istream& is, string& str);
// 	//while (cin >> str)
// 	while (operator>>(cin, str).operator bool())
// 	{
// 		cout << cin.good() << endl;
// 		cout << cin.eof() << endl;
// 		cout << cin.bad() << endl;
// 		cout << cin.fail() << endl << endl;

// 		cout << str << endl;			
// 	}

// 	cout << cin.good() << endl;
// 	cout << cin.eof() << endl;
// 	cout << cin.bad() << endl;
// 	cout << cin.fail() << endl << endl;

// 	// 恢复标志状态
// 	cin.clear();
// 	while (cin >> str)
// 	{
// 		cout << cin.good() << endl;
// 		cout << cin.eof() << endl;
// 		cout << cin.bad() << endl;
// 		cout << cin.fail() << endl << endl;

// 		cout << str << endl;
// 	}

// 	return 0;
// }





// int main()
// {
// 	int i = 0;
// 	cout << cin.good() << endl;
// 	cout << cin.eof() << endl;
// 	cout << cin.bad() << endl;
// 	cout << cin.fail() << endl << endl;

// 	cin >> i;
// 	cout << i << endl;

// 	// 11sss
// 	cout << cin.good() << endl;
// 	cout << cin.eof() << endl;
// 	cout << cin.bad() << endl;
// 	cout << cin.fail() << endl << endl;

// 	cin >> i;
// 	cout << i << endl;
// 	if (cin.fail())
// 	{
// 		cin.clear();
// 		char ch;
// 		while (cin.get(ch))
// 		{
// 			cout << ch;
// 		}
// 	}

// 	cin >> i;
// 	cout << i << endl;

// 	cout << cin.good() << endl;
// 	cout << cin.eof() << endl;
// 	cout << cin.bad() << endl;
// 	cout << cin.fail() << endl << endl;

// 	return 0;
// }




// int main()
// {
// 	do
// 	{
// 		if (cin.fail())
// 		{
// 			cout << "里面: " << endl;
// 			cin.clear();
// 			char ch;
// 			while (cin.get(ch))
// 			{
// 				cout << ch;
// 			}
// 		}

// 		cout << "外面: " << endl;
// 		int i = 0;
// 		cin >> i;
// 		cout << i << endl;
// 	} while (1);

// 	return 0;
// }





// int main()
// {
// 	// 在io需求比较高的地方，如部分大量输入的竞赛题中，加上以下3行代码
// 	// 可以提高C++IO效率
// 	ios_base::sync_with_stdio(false);
// 	cin.tie(nullptr);
// 	cout.tie(nullptr);

// 	//cout << "31312312";
// 	//cin >> i;

// 	return 0;
// }

#include<fstream>

// int main()
// {
// 	ofstream ofs("test.txt");
// 	//ofs.open("test.txt");
// 	ofs.put('x');
// 	ofs.write("hello\n", 6);

// 	ofs << "22222222" << endl;
// 	int x = 111;
// 	double y = 1.11;
// 	ofs << x << endl;
// 	ofs << y << endl;

// 	//ofs.close();

// 	return 0;
// }




// int main()
// {
// 	//ifstream ofs("test.cpp");
// 	ifstream ofs("D:\\8-10.png", ios_base::in | ios_base::binary);

// 	int n = 0;
// 	while (!ofs.eof())
// 	{
// 		char ch = ofs.get();
// 		//cout << ch;
// 		++n;
// 	}

// 	cout << n << endl;

// 	return 0;
// }




class Date
{
	friend ostream& operator << (ostream& out, const Date& d);
	friend istream& operator >> (istream& in, Date& d);
public:
	Date(int year = 1, int month = 1, int day = 1)
		:_year(year)
		, _month(month)
		, _day(day)
	{}
	operator bool()
	{
		// 这里是随意写的，假设输入_year为0，则结束
		if (_year == 0)
			return false;
		else
			return true;
	}
private:
	int _year;
	int _month;
	int _day;
};

istream& operator >> (istream& in, Date& d)
{
	in >> d._year >> d._month >> d._day;
	return in;
}

ostream& operator << (ostream& out, const Date& d)
{
	out << d._year << " " << d._month << " " << d._day;
	return out;
}

struct ServerInfo
{
	//char _address[32];
	string _address;

	int _port;
	Date _date;
};

struct ConfigManager
{
public:
	ConfigManager(const char* filename)
		:_filename(filename)
	{}

	// 二进制
	// 内存中怎么存，囫囵吞枣，怎么写出去
	void WriteBin(const ServerInfo& info)
	{
		ofstream ofs(_filename, ios_base::out | ios_base::binary);
		ofs.write((const char*)&info, sizeof(info));
	}

	void ReadBin(ServerInfo& info)
	{
		ifstream ifs(_filename, ios_base::in | ios_base::binary);
		ifs.read((char*)&info, sizeof(info));
	}


	void WriteText(const ServerInfo& info)
	{
		ofstream ofs(_filename);
		ofs << info._address << " " << info._port << " " << info._date;
	}

	void ReadText(ServerInfo& info)
	{
		ifstream ifs(_filename);
		ifs >> info._address >> info._port >> info._date;
	}

private:
	string _filename; // 配置文件
};




// int main()
// {
// 	ServerInfo winfo = { "192.0.0.1111111111111111111111", 80, { 2022, 4, 10 } };

// 	// 二进制读写
// 	ConfigManager cf_bin("test.bin");
// 	cf_bin.WriteBin(winfo);

// 	return 0;
// }




// int main()
// {
// 	// 二进制读写
// 	ConfigManager cf_bin("test.bin");

// 	ServerInfo rbinfo;
// 	cf_bin.ReadBin(rbinfo);

// 	cout << rbinfo._address << " " << rbinfo._port << " " << rbinfo._date << endl;

// 	return 0;
// }





// int main()
// {
// 	ServerInfo winfo = { "192.0.0.1", 80, { 2022, 4, 10 } };

// 	// 文本读写
// 	ConfigManager cf_text("test.text");
// 	cf_text.WriteText(winfo);

// 	return 0;
// }




// int main()
// {
// 	ConfigManager cf_text("test.text");
// 	ServerInfo rtinfo;
// 	cf_text.ReadText(rtinfo);
// 	cout << rtinfo._address << " " << rtinfo._port << " " << rtinfo._date << endl;

// 	return 0;
// }





#include<sstream>

// int main()
// {
// 	int i = 123;
// 	Date d = { 2022, 4, 10 };
// 	ostringstream oss;
// 	oss << i << endl;
// 	oss << d << endl;

// 	string s = oss.str();
// 	cout << s << endl;

// 	//istringstream iss(s);
// 	//istringstream iss;
// 	//iss.str("100 2024 9 9");
// 	istringstream iss("100 2024 9 9");
// 	int j;
// 	Date x;
// 	iss >> j >> x;

// 	return 0;
// }






// json库

struct ChatInfo
{
	string _name; // 名字
	int _id;      // id
	Date _date;   // 时间
	string _msg;  // 聊天信息
};

int main()
{
	// 结构信息序列化为字符串
	ChatInfo winfo = { "张三", 135246, { 2022, 4, 10 }, "晚上一起看电影吧" };
	ostringstream oss;
	oss << winfo._name << " " << winfo._id << " " << winfo._date << " " << winfo._msg;
	string str = oss.str();
	cout << str << endl << endl;
	// send(str);

	// str = recv()
	ChatInfo rInfo;
	istringstream iss(str);
	iss >> rInfo._name >> rInfo._id >> rInfo._date >> rInfo._msg;
	cout << "-------------------------------------------------------" << endl;
	cout << "姓名：" << rInfo._name << "(" << rInfo._id << ") ";
	cout << rInfo._date << endl;
	cout << rInfo._name << ":>" << rInfo._msg << endl;
	cout << "-------------------------------------------------------" << endl;


	return 0;
}